var idType = function(id) { return 'string' == typeof id ? document.getElementById(id) : id; };

var Extend = function(destination, source) {
	for(var pro in source) {
		destination[pro] = source[pro];
	}
	return destination;
}

var addEvent = function(obj, type, fn) {
	if(obj.addEventListener) {
		obj.addEventListener(type, fn, false);
		return true;
	}else if(obj.attachEvent) {
		obj['e'+type+fn] = fn;
		obj[type+fn] = function(){
			obj['e'+type+fn](window.event);
		}
		obj.attachEvent('on'+type, obj[type+fn]);
		return true;
	}
	return false;
}

function DateSelector(idYear, idMonth, idDate, options) {
	var D = new Date();
	this.year = idType(idYear);
	this.month = idType(idMonth);
	this.date = idType(idDate);
	this.nowYear = D.getFullYear();
	this.nowMonth = D.getMonth() + 1;
	this.nowDate = D.getDate();
	Extend(this, this.setOptions(options));
};
DateSelector.prototype = {
	setOptions: function(options){
		// 默认项
		this.options = {
			floorYear: 5, // 距当前年份前5年
			ceilYear: 0, // 距当前年份后0年
			onStart: function(){
//				var ar = [ "年", "月", "日" ];
//				$("#year").prepend("<option value='' selected='selected'>" + ar[0] + "</option>");
//				$("#month").prepend("<option value='' selected='selected'>" + ar[1] + "</option>");
//				$("#date").prepend("<option value='' selected='selected'>" + ar[2] + "</option>");
			}, // 前置事件
			onEnd: function(){} // 结束事件
		};
		return Extend(this.options, options || {});
	},
	createOption: function(container, start, end, sign){
		sign = sign || start;
		var _num = parseInt(end-start+1, 10); 
		container.options.length = _num;
		for(var i = 0; i < _num; i++) {
			container.options[i].text = container.options[i].value = start + i;
		}
		container.selectedIndex = (sign-start >= _num ? _num-1 : sign-start);
	},
	getDate: function(y, m){
		return new Date(y, m, 0).getDate();
	},
	getSelText: function(sel) {
		return sel.options[sel.selectedIndex].text;
	},
	changeDate: function(bindO){
		var _this = this;
		addEvent(bindO, 'change', function(){
			var y = _this.getSelText(_this.year), m = _this.getSelText(_this.month), d = _this.getSelText(_this.date);
			_this.createOption(_this.date, 1, _this.getDate(y, m), d);
			_this.onEnd();
		});
	},
	bindEvents: function(){
		var _this = this;
		this.changeDate(this.year); 
		this.changeDate(this.month);
		addEvent(this.date, 'change', function(){ _this.onEnd(); });
	},
	init: function(){
		var _startYear = parseInt(this.nowYear - this.floorYear, 10);
		var _endYear = parseInt(this.nowYear + this.ceilYear, 10);
		var _endDate = this.getDate(this.nowYear, this.nowMonth, 0);
		this.createOption(this.year, _startYear, _endYear, this.nowYear);
		this.createOption(this.month, 1, 12, this.nowMonth);
		this.createOption(this.date, 1, _endDate, this.nowDate);
		this.bindEvents();
		this.onStart();
	}
};